/*
 * @author: Sawyer(870756077@qq.com)
 */

// import Vue from 'vue'
import * as types from '../mutation-types'

let state = {
    /**
     * 可视化模块
     */
    modules: [],
    /**
     * 组件名称
     */
    componentName: ''
}

let actions = {
    /**
     * modules 排序
     */
    updateModules({ commit }, { modules }) {
        commit(types.UPDATE_MODULES, { modules })
    },
    /**
     * 新增一个module
     *
     * @param {Number} newIndex - 添加的新的索引位置
     * @param {Object} module - 新增的 module 信息
     */
    addModule({ commit }, { newIndex, module }) {
        commit(types.ADD_MODULE, { newIndex, module })
    },
    /**
     * 根据索引删除该 module
     *
     * @param {Number} index - modules index
     */
    removeModule({ commit }, { index }) {
        commit(types.REMOVE_MODULE, { index })
    },
    updateDataAttr({ commit }, o) {
        commit(types.UPDATE_DATA_ATTR, o)
    },
    /**
     * 修改 modules setting 显示隐藏
     *
     * @param {Number} index - modules index
     */
    moduleSetting({ commit }, { index }) {
        commit(types.MODULE_SETTING, { index })
    },
    /**
     * 删除指定modules index 的 list index 的数据
     *
     * @param {Number} index - modules index
     */
    removeList({ commit }, { index, listIndex }) {
        commit(types.REMOVE_LIST, { index, listIndex })
    },
    /**
     * data list 数据拖拽排序
     */
    sortList({ commit }, { index, list }) {
        commit(types.SORT_LIST, { index, list })
    }
}

let mutations = {
    [types.UPDATE_MODULES](state, { modules }) {
        state.modules = modules
    },
    [types.ADD_MODULE](state, { newIndex, module }) {
        state.modules.splice(newIndex, 0, module)
    },
    [types.REMOVE_MODULE](state, { index }) {
        if (state.modules[index].setting) {
            // 如果删除的组件是当前选中的组件则清空 componentName 的值
            state.componentName = ''
        }
        state.modules.splice(index, 1)
    },
    /**
     * 修改 modules 的属性值
     *
     * @param {String} belong - data or allValue default allvalue
     * @param {String} attrName - 属性名称
     * @param {Number} index - modules index
     * @param {Number} listIndex - list index default 0
     * @param {String} value - 修改后的新值
     */
    [types.UPDATE_DATA_ATTR](
        state,
        { belong, attrName, index, value, listIndex }
    ) {
        if (belong === 'data') {
            // data 下的直系属性
            state.modules[index].data[attrName] = value
        }
        if (belong === 'allValue') {
            // allValue 下的
            state.modules[index].data.allValue[attrName] = value
        }
        if (belong === 'list') {
            // list数组下的
            state.modules[index].data.list[listIndex][attrName] = value
        }
    },
    [types.MODULE_SETTING](state, { index }) {
        if (!state.modules[index].setting) {
            state.modules.forEach(item => {
                item.setting = 0
            })
            // 根据 module 名称获取到对应的 component name
            state.componentName = require(`@/components/${state.modules[index]
                .module}/data/local`).componentName

            state.modules[index].setting = 1
        }
    },
    [types.REMOVE_LIST](state, { index, listIndex }) {
        state.modules[index].data.list.splice(listIndex, 1)
    },
    [types.SORT_LIST](state, { list, index }) {
        state.modules[index].data.list = list
    }
}

export default {
    namespaced: true,
    state,
    actions,
    mutations
}
